﻿#region Copyright
// Copyright (c) 2011-2012 RaisingForce Team (Alikin Sergey)
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion

using RaisingForce.Raise.Language.Model;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace RaisingForce.Raise.Tests
{


    /// <summary>
    ///Это класс теста для WordFabricExtensionsTest, в котором должны
    ///находиться все модульные тесты WordFabricExtensionsTest
    ///</summary>
    [TestClass()]
    public class WordFabricExtensionsTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///Получает или устанавливает контекст теста, в котором предоставляются
        ///сведения о текущем тестовом запуске и обеспечивается его функциональность.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Дополнительные атрибуты теста
        // 
        //При написании тестов можно использовать следующие дополнительные атрибуты:
        //
        //ClassInitialize используется для выполнения кода до запуска первого теста в классе
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //ClassCleanup используется для выполнения кода после завершения работы всех тестов в классе
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //TestInitialize используется для выполнения кода перед запуском каждого теста
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //TestCleanup используется для выполнения кода после завершения каждого теста
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///Тест для CreateWord
        ///</summary>
        [TestMethod()]
        public void CreateWordTest()
        {
            const string wordTypeName = WordTypeNames.LookForObject;
            const string primaryGlyphTypeName = DirectionGlyph.Name;
            const string primaryGlyphValue = "Right";
            const string secondaryGlyphTypeName = ObjectGlyph.Name;
            IWordFabric wordFabric = new WordFabric();
            WordData wordData =
                new WordData
                {
                    WordTypeName = wordTypeName,
                    PrimaryGlyphValue = primaryGlyphValue,
                };
            IfWord actualIf;
            actualIf = wordFabric.CreateWord<IfWord>(wordData);
            Assert.AreEqual(wordTypeName, actualIf.WordType.Name);
            Assert.AreSame(typeof(DirectionGlyph), actualIf.WordType.PrimaryGlyphType);
            Assert.AreSame(typeof(ObjectGlyph), actualIf.WordType.SecondaryGlyphType);
            Assert.AreEqual(WordContext.If, actualIf.WordType.Context);
            Assert.AreEqual(20, actualIf.WordType.Priority);
            Assert.AreEqual(primaryGlyphTypeName, actualIf.PrimaryGlyph.TypeName);
            Assert.AreEqual(primaryGlyphValue, actualIf.PrimaryGlyph.Value);
            Assert.IsInstanceOfType(actualIf.PrimaryGlyph, typeof(DirectionGlyph));
            Assert.AreEqual(DirectionType.Right, ((DirectionGlyph)actualIf.PrimaryGlyph).Value);
            Assert.AreEqual(secondaryGlyphTypeName, actualIf.SecondaryGlyph.TypeName);
            Assert.IsInstanceOfType(actualIf.SecondaryGlyph, typeof(ObjectGlyph));
            Assert.AreEqual(ObjectGlyph.SingletonValue, actualIf.SecondaryGlyph.Value);
        }
    }
}
